/***
 * Online Store Retailer
 *
 * Copyright (C) 2013 Integrator Project N.2 Class
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Authors: Leaders: Johan Santacruz, Sebasti�n Santamaria
 *          Quality assurance: Miguel Jimen�z, Juan David Lenis, Johnatan Zarama
 *          A Developers: Sebasti�n Cortes, Luis Dominguez
 *          B Developers: Fabi�n Caicedo, Andr�s Agredo, Javier Vasquez, Nicol�s Lema          
 */
package com.pi2.osr.war.backingbean;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.primefaces.event.RateEvent;

import com.pi2.osr.ejb.custom.CompraCustom;
import com.pi2.osr.ejb.custom.DetalleCompraCustom;
import com.pi2.osr.ejb.custom.UsuarioCustom;
import com.pi2.osr.ejb.entities.Compra;
import com.pi2.osr.ejb.entities.Detallecompra;
import com.pi2.osr.ejb.entities.Detalletemporal;
import com.pi2.osr.ejb.entities.Producto;
import com.pi2.osr.ejb.entities.Usuario;
import com.pi2.osr.ejb.utilities.OSRException;

@ManagedBean(name = "DetalleCompraBean")
@SessionScoped
public class DetalleCompraBackingBean {

	private BigInteger calificacionActual;

	public BigInteger getCalificacionActual() {
		return calificacionActual;
	}

	public void setCalificacionActual(BigInteger calificacionActual) {
		this.calificacionActual = calificacionActual;
	}

	private String mensajeEsCalificable;

	public String getMensajeEsCalificable() {
		return mensajeEsCalificable;
	}

	public void setMensajeEsCalificable(String mensajeEsCalificable) {
		this.mensajeEsCalificable = mensajeEsCalificable;
	}

	private Integer rating;

	public Integer getRating() {
		return rating;
	}

	public void setRating(Integer rating) {
		this.rating = rating;
	}

	@EJB
	private CompraCustom compraCustom;

	private BigDecimal compraTempId;

	public BigDecimal getCompraTempId() {
		return compraTempId;
	}

	public void setCompraTempId(BigDecimal compraTempId) {
		this.compraTempId = compraTempId;
	}

	private List<Compra> listTempCompras = new ArrayList<Compra>();

	private List<Detallecompra> listTempDetalleCompra = new ArrayList<Detallecompra>();

	public List<Detallecompra> getListTempDetalleCompra() {
		return listTempDetalleCompra;
	}

	public void setListTempDetalleCompra(
			List<Detallecompra> listTempDetalleCompra) {
		this.listTempDetalleCompra = listTempDetalleCompra;
	}

	public List<Compra> getListTempCompras() {
		return listTempCompras;
	}

	public void setListTempCompras(List<Compra> listTempCompras) {
		this.listTempCompras = listTempCompras;
	}

	private Detallecompra detalleTemporal;

	public Detallecompra getDetalleTemporal() {
		return detalleTemporal;
	}

	public void setDetalleTemporal(Detallecompra detalleTemporal) {
		this.detalleTemporal = detalleTemporal;
	}

	@EJB
	private DetalleCompraCustom detalleCompraCustom;

	@EJB
	private UsuarioCustom usuarioCustom;

	private Usuario usuario = null;

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	@PostConstruct
	public void Init() {

		detalleTemporal = new Detallecompra();
		rating = new Integer(0);

		mensajeEsCalificable = "";

		calificacionActual = BigInteger.valueOf(0);

		compraTempId = new BigDecimal(0);

		FacesContext context = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) context.getExternalContext()
				.getSession(false);

		if (session != null) {

			usuario = (Usuario) session.getAttribute("user");

			if (usuario != null) {

				try {

					listTempCompras = obtenerCompras(usuario);
				} catch (Exception e) {
					FacesMessage msg = new FacesMessage(
							FacesMessage.SEVERITY_INFO, "Carga",
							mensajeEsCalificable);
					FacesContext.getCurrentInstance().addMessage(null, msg);
				}
			}

		} else {
			session = (HttpSession) context.getExternalContext().getSession(
					true);
			usuario = (Usuario) session.getAttribute("user");

			if (usuario != null) {

				try {

					listTempCompras = obtenerCompras(usuario);
				} catch (Exception e) {
					FacesMessage msg = new FacesMessage(
							FacesMessage.SEVERITY_INFO, "Carga",
							mensajeEsCalificable);
					FacesContext.getCurrentInstance().addMessage(null, msg);
				}
			}
		}

	}

	public void calificarProducto(Integer valor, Detallecompra detallecompra)
			throws OSRException {
		detalleCompraCustom.calificarProducto(valor, detallecompra);
	}

	public BigInteger obtenerCalificacion(Producto p) {
		return detalleCompraCustom.obtenerCalificacionProducto(p);
	}

	public List<Compra> obtenerCompras(Usuario usuario) {
		List<Compra> retorno = new ArrayList<Compra>();
		try {
			retorno = usuarioCustom
					.getUsuarioFindByIdusuario(usuario.getIdusuario()).get(0)
					.getCompraList();
			System.out.println(retorno.size());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retorno;
	}

	public List<Detallecompra> obtenerDetallesCompra() {
		listTempDetalleCompra = compraCustom
				.getCompraFindByIdcompra(compraTempId).get(0)
				.getDetallecompraList();
		return listTempDetalleCompra;
	}

	public void guardarCalificacion(Detallecompra detallecompra) {

		Detallecompra detalleTemp = detalleCompraCustom
				.getDetallecompraFindByIddetalle(detallecompra.getIddetalle())
				.get(0);

		if (detalleTemp.getCalificacion() == null) {
			detalleTemp.setCalificacion(BigInteger.valueOf(rating));
			detalleCompraCustom.mergeDetallecompra(detalleTemp);

			mensajeEsCalificable = "Calificable";
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Mensaje", mensajeEsCalificable);
			FacesContext.getCurrentInstance().addMessage(null, msg);

		} else {

			mensajeEsCalificable = "No calificable";
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Mensaje", mensajeEsCalificable);
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}

	public void guardarCalificacion(Detallecompra detallecompra, Integer num) {

		Detallecompra detalleTemp = detalleCompraCustom
				.getDetallecompraFindByIddetalle(detallecompra.getIddetalle())
				.get(0);

		if (detalleTemp.getCalificacion() == null) {
			detalleTemp.setCalificacion(BigInteger.valueOf(num));
			detalleCompraCustom.mergeDetallecompra(detalleTemp);

			mensajeEsCalificable = "Calificable";
			RequestContext context = RequestContext.getCurrentInstance();
			context.execute("alert('" + mensajeEsCalificable + "')");
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Mensaje", mensajeEsCalificable);
			FacesContext.getCurrentInstance().addMessage(null, msg);

		} else {

			mensajeEsCalificable = "No calificable";
			RequestContext context = RequestContext.getCurrentInstance();
			context.execute("alert('" + mensajeEsCalificable + "')");
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
					"Mensaje", mensajeEsCalificable);
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
	}

	public BigInteger obtenercalificacion(Producto p) {
		calificacionActual = detalleCompraCustom.obtenerCalificacionProducto(p);
		return calificacionActual;
	}

	public void onrate(RateEvent rateEvent) {
		Integer num = ((Integer) rateEvent.getRating()).intValue();
		guardarCalificacion(detalleTemporal, num);
	}

	public void cambiarDetalleTemp(Detallecompra com) {
		// TODO Auto-generated method stub
		if (com != null) {
			setDetalleTemporal(com);
		} else {
			RequestContext context = RequestContext.getCurrentInstance();
			context.execute("alert('Error en el detalle')");
		}
	}
}
